package elementos;

import mapControl.GraphicsMapControl;
import modelLoader.ModelLoader;

import com.jme.math.Quaternion;
import com.jme.math.Vector3f;
import com.jme.renderer.Renderer;
import com.jme.scene.Node;
import com.model.md5.controller.MD5Controller;

/**
 * Bomberman
 * @ author Sebastian Giulietti 69032 
 * @ author Adrian Sanchez 64251
 */
/**
 * @author Seba
 *
 */
public class Player extends Elemento {

	private MD5Controller bodyController;
	int direction = 0;
	private GraphicsMapControl mapControl;
	private Vector3f newpos;
	private Vector3f oldpos;

	/** Constructor por defecto
	 * @param mapControl control del mapa
	 */
	public Player(GraphicsMapControl mapControl) {
		super();
		this.mapControl = mapControl;
		setName("Player");
		this.bodyController = ModelLoader.getPlayerController();
		Node model = ModelLoader.getPlayerModel();
		Quaternion rot;
		rot = model.getLocalRotation();
		rot.fromAngleAxis((float) +Math.toRadians(90), Vector3f.UNIT_Y);

		model.setLocalScale(.25f);
		model.setLocalTranslation(0, 5, 0);
		node.attachChild(model);

		setRow(1);
		setCol(1);
		
		moverA(row, col);

		node.setRenderQueueMode(Renderer.QUEUE_OPAQUE);
		mapControl.getRootNode().attachChild(node);
	}

	/**
	 * Direccion en la que esta mirando el jugador
	 * @return direccion 0 = norte, 1 = este, 2 = sur, 3 = oeste
	 */
	public int getDirection() {
		return direction;
	}

	/** Movimento interpolado entre una posicion inicial y una posicion final
	 * @param start posicion inicial
	 * @param end posicion final
	 * @param type tipo de movimiento
	 * @param time tiempo entre frames
	 * @param store posicion actual
	 */
	private void interpolateTranslation(Vector3f start, Vector3f end, int type,
			float time, Vector3f store) {
		if (start.distance(end) > 0.1) {
			if (!bodyController.getActiveAnimation().getName()
					.equals("caminar")) {
				bodyController.setSpeed(mapControl.getSpeed() * 2f);
				bodyController.fadeTo("caminar", 0, true);
			}
		}
		store.set(start).multLocal(1 - time).addLocal(end.x * time,
				end.y * time, end.z * time);
	}

	/**
	 * Mata al jugador y termina el juego 
	 */
	public void kill() {
		if (!mapControl.getGodMode()){
			mapControl.setGameOver(true);
		}
	}

	/** Marca una nueva posicion para que el jugador se mueva
	 * @param row row
	 * @param col col
	 */
	public void moverA(int row, int col) {

		if (mapControl.isEmpty(row, col) || (mapControl.getGodMode()) && mapControl.getCelda(row, col).getNonDesWallBox() == null) {
			int lastRow = getRow();
			int lastCol = getCol();

			this.setRow(row);
			this.setCol(col);

			oldpos = node.getLocalTranslation();
			newpos = mapControl.getTraslationCentrada(row, col);

			mapControl.getCelda(lastRow, lastCol).setPlayer(null);
			mapControl.getCelda(row, col).setPlayer(this);
			if (!mapControl.getCelda(row, col).getEnemies().isEmpty())
				kill();

		}
	}

	/**
	 * Rota a la izquierda
	 */
	public void rotateLeft() {
		if (direction == 0)
			direction = 3;
		else
			direction--;
	}

	/**
	 * Rota a la derecha
	 */
	public void rotateRight() {
		direction = (direction + 1) % 4;
	}

	/**
	 * Actualiza la posicion del jugador 
	 */
	public void update() {
		interpolateTranslation(oldpos, newpos, 0, mapControl.getSpeed() / 10,
				node.getLocalTranslation());

	}

	/** Control de la animacion
	 * @return control de animacion
	 */
	public MD5Controller getPlayerController() {
		return bodyController;
	}

}
